var viewer;//全局cesium对象
var mancarHeight;//车辆和人员定位的临时高度,有三维模型的,用clamptoheight替代
var base3dtilesPrimitives = [];//3dtiles实景三维数据底图数据
var tilesUrl;//多质量等级三维地图数据集
var modelMatrixData;//多质量等级三维地图数据集的位置移动矩阵
var initView;//初始位置数据集
var googleimageryProvider;
var tdtannoimageryProvider;
var googleimagery;
var tdtannoimagery;
var tdtimagery;
var tdtvectorimagery;
var tdtvectoranoimagery;
var arcgisProvider;
var localimagery;
var cur_height;//当前高度
var cur_west;
var cur_east;
var cur_south;
var cur_north;
const minHeight=1000;
var ug;//地下模式
var is_ug_open=0;
var baseShPrimitives=[];
function initmap3D(mapOptions){
var tdtimganourl = "http://t0.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile"
+"&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}"
+"&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg"
+"&tk=3fd07756862125febfd7b53271a90dbd";
//天地图影像注记
tdtannoimageryProvider = new Cesium.WebMapTileServiceImageryProvider({
url: tdtimganourl,
layer: "tdtimganoLayer",
// layer: "tdtAnnoLayer" ,//注记
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false
});
var tdtvecurl = "http://t0.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile"
+"&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}"
+"&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg"
+"&tk=3fd07756862125febfd7b53271a90dbd";
//天地图二维底图
var tdtvectorProvider = new Cesium.WebMapTileServiceImageryProvider({
url: tdtvecurl,
layer: "tdtvecLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false,
});
var tdtvecanourl = "http://t0.tianditu.gov.cn/cva_w/wmts?service=wmts&request=GetTile"
+"&version=1.0.0&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}"
+"&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg"
+"&tk=3fd07756862125febfd7b53271a90dbd";
//天地图二维底图注记
var tdtvectoranoProvider = new Cesium.WebMapTileServiceImageryProvider({
url: tdtvecanourl,
layer: "tdtvecLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false
});
//谷歌网络影像
googleimageryProvider = new Cesium.UrlTemplateImageryProvider({
// url:"http://mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}&s=Gali",
url:'http://www.google.cn/maps/vt?lyrs=s@800&x={x}&y={y}&z={z}',
tilingScheme:new Cesium.WebMercatorTilingScheme(),
minimumLevel:1,
maximumLevel:20
});
//天地图影像服务,质量太差,如无特殊要求就不用
var tdtimgurl = "http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile"
+"&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles"
+"&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}&"
+"tk=3fd07756862125febfd7b53271a90dbd"
var tdtimageryProvider = new Cesium.WebMapTileServiceImageryProvider({
url: tdtimgurl,
layer: "tdtimgLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: true
});
arcgisProvider=new Cesium.ArcGisMapServerImageryProvider({
url : 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
});
googleimagery = new Cesium.ImageryLayer(googleimageryProvider, {});
tdtimagery = new Cesium.ImageryLayer(tdtimageryProvider, {});
tdtannoimagery = new Cesium.ImageryLayer(tdtannoimageryProvider, {});
tdtvectorimagery = new Cesium.ImageryLayer(tdtvectorProvider, {});
tdtvectoranoimagery = new Cesium.ImageryLayer(tdtvectoranoProvider, {});
// localimagery = new Cesium.ImageryLayer(localimageryProvider, {});
//cesium全球30米分辨率地形资源token
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI0NjBlYzRiYS0wMDRhL'
+'TRjZWYtODJhOS1jZTk5ZmI4ZDg5ZTIiLCJpZCI6ODI1MCwic2NvcGVzIjpbImFzciIsImdjIl0sImlhdCI6MTU1MTU3M'
+'DU1Mn0.yfJ_i4EPiunFj_qUftuv1ksx4pUNgnPC16vQCBGrM08';
//初始化三维场景
viewer = new Cesium.Viewer('cesiumContainer',{
fullscreenButton:false,
homeButton:false,
timeline:true,
geocoder:false,
scene3DOnly:true,
sceneModePicker:false,
baseLayerPicker:false,
shouldAnimate:true,
navigationHelpButton:false,
//imageryProvider:googleimageryProvider,
imageryProvider:tdtannoimageryProvider,
//imageryProvider:arcgisProvider,
terrainProvider:Cesium.createWorldTerrain({requestWaterMask:true}),
terrainExaggeration:Number($('#terrainEx').val())
});
viewer.imageryLayers.add(tdtimagery);
//viewer.imageryLayers.addImageryProvider(arcgisProvider);
viewer.imageryLayers.addImageryProvider(tdtannoimageryProvider);
//viewer.imageryLayers.addImageryProvider(googleimageryProvider);
viewer.scene.globe.depthTestAgainstTerrain = true;
viewer.scene._hdr = false;
viewer.scene.fxaa = false;
viewer.scene.globe.maximumScreenSpaceError = 6/3;
viewer.scene.postProcessStages.fxaa.enabled=false;
// viewer.scene.screenSpaceCameraController.enableCollisionDetection = enable;
// viewer.scene.globe.translucency.frontFaceAlpha = alpha;
//地图灰度系数
var layer0 = viewer.scene.imageryLayers.get(0);
layer0.gamma = 0.66;
// viewer.scene.globe.enableLighting = true//必须开启光照效果
//加载导航工具
var navOptions = {};
navOptions.defaultResetView = Cesium.Rectangle.fromDegrees(
mapOptions.initView.lon-0.01, mapOptions.initView.lat-0.01,
mapOptions.initView.lon+0.01, mapOptions.initView.lat+0.01);
navOptions.enableCompass = true;
navOptions.enableZoomControls = true;
navOptions.enableDistanceLegend = true;
navOptions.enableCompassOuterRing = true;
viewer.extend(Cesium.viewerCesiumNavigationMixin, navOptions);//加入导航工具扩展
viewer.extend(Cesium.xbsjGroundPrimitiveMixin);//加入贴地纹理扩展
tilesUrl = mapOptions.tilesUrl;
modelMatrixData = mapOptions.modelMatrixData;
//add3dtilesmap('hquality');
initView = mapOptions.initView;
wholeView();
if(mapOptions.water!=undefined&&mapOptions.water!=[]){
createWater(mapOptions.water);
}
//切换地下模式
ug = new underground(viewer,
{
depth : 5000,
alpha : 0.66
})
// ug.activate();
// mancarHeight = mapOptions.mancarHeight;
//初始化项目点
//initProject();
var previousPickedEntity = {
feature: undefined,
originalColor: undefined
};
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
var pick = viewer.scene.pick(movement.position);
if (pick instanceof Cesium.Cesium3DTileFeature) {
var propertyNames = pick.getPropertyNames();
var length = propertyNames.length;
var content="";
for (var i = 0; i < length; ++i) {
var propertyName = propertyNames[i];
content += propertyName + ': ' + pick.getProperty(propertyName)+'
'
}
layer.msg(content);
//判断以前是否选择要素
if (pick != previousPickedEntity.feature) {
if (previousPickedEntity.feature != undefined) {
//还原前选择要素的本颜色
previousPickedEntity.feature.color = previousPickedEntity.originalColor;
//将当前选择要素及其颜色添加到previousPickedEntity
previousPickedEntity.feature = pick;
previousPickedEntity.originalColor = pick.color;
}
//将当前选择要素及其颜色添加到previousPickedEntity
previousPickedEntity.feature = pick;
previousPickedEntity.originalColor = pick.color;
}
//将模型变为黄色高亮
pick.color = Cesium.Color.YELLOW;
}
else if (Cesium.defined(pick) && Cesium.defined(pick.id.id) && pick.id.id.indexOf("project_")!= -1 ) {
var id=pick.id.id;
var id2=parseInt(id.substring(8));
showProjectTables(id2);
}
else if(Cesium.defined(pick) && Cesium.defined(pick.id.id) && pick.id.id.indexOf("pm25_")!= -1){
var id=pick.id.id;
var jData={"id":1};
layer.open({
type: 2,
title: "传感器编号:"+id+"氨气数据展示",
maxmin: true,
shade: 0,
maxmin:false,
scrollbar: false,
offset: 'rt',
shadeClose: false, //点击遮罩关闭层
area : ['600px' , '350px'],
resize:false,
content: 'smelldata/smellChart.html',
success: function (layero, index) {
var iframe = window['layui-layer-iframe' + index];//拿到iframe元素
iframe.child(JSON.stringify(1))//向此iframe层方法 传递参数
}
});
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//双击事件
var handlerDoubleClick = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handlerDoubleClick.setInputAction(function (movement) {
var pick = viewer.scene.pick(movement.position);
}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
//鼠标小手状态
var handlerMouseMove=new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handlerMouseMove.setInputAction(function (movement) {
var pick = viewer.scene.pick(movement.endPosition);
if (Cesium.defined(pick)) {
viewer._container.style.cursor = "pointer";
} else{
viewer._container.style.cursor = "default";
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
function openUg(){
ug.activate();
is_ug_open=1;
}
function closeUg(){
ug.disable();
is_ug_open=0;
}
//移除地图上的采样数据
function removeSample(){
var entitys = viewer.entities._entities._array;
for (var i = 0; i < entitys.length; i++) {
if (entitys[i]._id.indexOf("sampleEvent_")!=-1 ||entitys[i]._id.indexOf("samplePlan_")!=-1) {
viewer.entities.remove(entitys[i]);
i--;
}
}
}
//移除项目点
function removeProject(){
var entitys = viewer.entities._entities._array;
for (var i = 0; i < entitys.length; i++) {
if (entitys[i]._id.indexOf("project_")!=-1) {
viewer.entities.remove(entitys[i]);
i--;
}
}
}
//初始化项目点
function initProject(){
for(var i=0;i= 20", "rgba(255, 182, 193, 1.0)"],
["${floor} >= 15", "rgb(102, 71, 151)"],
["${floor} >= 13", "rgb(170, 162, 204)"],
["${floor} >= 12", "rgb(224, 226, 238)"],
["${floor} >= 10", "rgb(252, 230, 200)"],
["${floor} >= 8", "rgb(248, 176, 87)"],
["${floor} >= 6", "rgb(198, 106, 11)"],
["true", "rgb(127, 59, 8)"],
],
}
});
}
//加载3dtiles数据
base3dtilesPrimitives.push(viewer.scene.primitives.add(tileset));
}
}
function randomRgbaColor() { //随机生成RGBA颜色
var r = Math.floor(Math.random() * 256); //随机生成256以内r值
var g = Math.floor(Math.random() * 256); //随机生成256以内g值
var b = Math.floor(Math.random() * 256); //随机生成256以内b值
var alpha = Math.random(); //随机生成1以内a值
return "rgba(" + r + "," + g + "," + b +","+ 1 + ")"; //返回rgba(r,g,b,a)格式颜色
}
function addBusTest(){
var url="../assets/bus2.gltf";
var lng= 116.3930,lat= 39.9128,height= 50.0, scale = 3.0 ;
addGltf(url,lng,lat,height,scale);
}
function addBusTest2(){
var url="../assets/bus2.gltf";
var lng= 116.3939,lat= 39.9058,height= 100.0, scale = 5.0 ;
addGltf(url,lng,lat,height,scale);
}
function addBusTest3(){
var url="../assets/bus2.gltf";
var lng= 116.3986,lat= 39.9070,height=100.0, scale = 5.0 ;
addGltf(url,lng,lat,height,scale);
}
function addGltf(url,lng,lat,height,scale){
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(lng, lat,height));
var model=viewer.scene.primitives.add(Cesium.Model.fromGltf({
url : url, //如果为bgltf则为.bgltf
modelMatrix : modelMatrix,
scale : scale, //放大倍数
}));
let m = model.modelMatrix;
//构建一个三阶旋转矩阵。模型旋转一定的角度,fromRotation[Z]来控制旋转轴,toRadians()为旋转角度,转为弧度再参与运算
let m1 = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(-78));
//矩阵计算
Cesium.Matrix4.multiplyByMatrix3(m,m1,m);
//将计算结果再赋值给modelMatrix
model.modelMatrix = m;
}
function add3DtileJson(url,lng,lat,height,head,pitch,roll,scaleparam){
var modelMatrix = Cesium.Matrix4.fromArray([
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
]);
var tilesetOption = {
url: url,
maximumScreenSpaceError: 1,
maximumNumberOfLoadedTiles: 2000,
maximumMemoryUsage: 8192,
skipLevels: 1,
modelMatrix: modelMatrix//引入转移矩阵
};
var tileset = new Cesium.Cesium3DTileset(tilesetOption);
let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(head));
let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(pitch));
let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(roll));
let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
//平移
let position = Cesium.Cartesian3.fromDegrees(lng, lat, params.height);
let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
let scale = Cesium.Matrix4.fromUniformScale(scaleparam);
// //缩放
Cesium.Matrix4.multiply(m, scale, m);
//旋转、平移矩阵相乘
Cesium.Matrix4.multiply(m, rotationX, m);
Cesium.Matrix4.multiply(m, rotationY, m);
Cesium.Matrix4.multiply(m, rotationZ, m);
tileset.readyPromise.then(function () {
}).then(function () {
if (tileset._root.transform == undefined) {
console.log("瓦片未变换");
}
tileset._root.transform = m;
});
base3dtilesPrimitives.push(viewer.scene.primitives.add(tileset));
}
//卸载3dtiles实景三维数据底图
function remove3dtilesmap(){
if(base3dtilesPrimitives!=[]){
for ( var i = 0; i < base3dtilesPrimitives.length; i++) {
viewer.scene.primitives.remove(base3dtilesPrimitives[i]);
}
base3dtilesPrimitives = [];
}
}
//创建水体
function createWater(water){
for ( var i = 0; i < water.length; i++) {
var waterPmt = new Cesium.Primitive({
geometryInstances : new Cesium.GeometryInstance({
geometry : new Cesium.PolygonGeometry({
polygonHierarchy : new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArrayHeights(water[i])),
perPositionHeight : true,
vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT
}),
}),
appearance : new Cesium.EllipsoidSurfaceAppearance({
aboveGround : true,
}),
show : true
});
waterPmt.appearance.material = new Cesium.Material({
fabric : {
type : 'Water',
uniforms : {
//specularMap: '../images/earthspec1k.jpg',
//normalMap: Cesium.buildModuleUrl('../images/waterNormals.jpg'),
frequency: 1000.0,
animationSpeed: 0.005,
amplitude: 1.0
}
}
});
viewer.scene.primitives.add(waterPmt);
}
}
//加载街道矢量瓦片数据
function addVectorLayer(){
viewer.imageryLayers.remove(tdtannoimagery,false);
viewer.imageryLayers.remove(googleimagery,false);
viewer.imageryLayers.remove(tdtimagery,false);
viewer.imageryLayers.add(tdtvectorimagery);
viewer.imageryLayers.add(tdtvectoranoimagery);
}
//加载谷歌遥感影像瓦片数据
function addImageLayer(){
viewer.imageryLayers.remove(tdtvectorimagery,false);
viewer.imageryLayers.remove(tdtvectoranoimagery,false);
viewer.imageryLayers.remove(tdtimagery,false);
viewer.imageryLayers.add(googleimagery);
viewer.imageryLayers.add(tdtannoimagery);
}
//加载天地图遥感影像瓦片数据
function addtdtImageLayer(){
viewer.imageryLayers.remove(googleimagery,false);
viewer.imageryLayers.remove(tdtvectorimagery,false);
viewer.imageryLayers.remove(tdtvectoranoimagery,false);
viewer.imageryLayers.add(tdtimagery);
viewer.imageryLayers.add(tdtannoimagery);
}
//切换地形加载
function addWorldTerrain(){
viewer.scene.terrainProvider = Cesium.createWorldTerrain({requestWaterMask:true});
}
//本地地形
function addchTerrain(){
var terrainProvider = new Cesium.CesiumTerrainProvider({
url:serverIP + "chineseterrain"
});
viewer.scene.terrainProvider = terrainProvider;
}
//椭球
function addelTerrain(){
viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider({});
}
function loadShnangHaigzw(){
var promise = Cesium.GeoJsonDataSource.load('../assets/gzw.json',{
stroke: Cesium.Color.BROWN ,
fill: Cesium.Color.BROWN
});
promise.then(function(dataSource) {
viewer.dataSources.add(dataSource);
smiplemodeldata = dataSource;
var entities = dataSource.entities.values;
// var colorHash = {};
for (var i = 0; i < entities.length; i++) {
var entity = entities[i];
// var name = entity.properties.name;
entity.polygon.heightReference = Cesium.HeightReference.RELATIVE_TO_GROUND;
entity.polygon.outline = false;
entity.polygon.extrudedHeight = 500;
entity.polygon.extrudedHeightReference = Cesium.HeightReference.RELATIVE_TO_GROUND;
}
}).otherwise(function(error){
swal(error,"请重试!","error");
});
}
var smiplemodeldata;
function loadsmiplemodel(){
$('#loading').show();
viewer.imageryLayers.remove(tdtannoimagery,false);
viewer.imageryLayers.remove(googleimagery,false);
viewer.imageryLayers.remove(tdtvectorimagery,false);
viewer.imageryLayers.remove(tdtvectoranoimagery,false);
viewer.imageryLayers.add(localimagery);
var promise = Cesium.GeoJsonDataSource.load('../../easy3dfile/data/buildings/buildings_haerbin.json');
promise.then(function(dataSource) {
viewer.dataSources.add(dataSource);
smiplemodeldata = dataSource;
var entities = dataSource.entities.values;
var colorHash = {};
for (var i = 0; i < entities.length; i++) {
var entity = entities[i];
var name = entity.properties.name;
var color;
color = Cesium.Color.DEEPSKYBLUE.withAlpha(1.0);
entity.polygon.outline = false;
var alphamaterial = new Cesium.Material({
fabric: {
type: 'Image',
uniforms: {
image: '../images/building.png',
},
}
});
entity.polygon.material = alphamaterial;
entity.polygon.heightReference = Cesium.HeightReference.RELATIVE_TO_GROUND;
entity.polygon.extrudedHeight = 0.0;
entity.polygon.extrudedHeightReference = Cesium.HeightReference.CLAMP_TO_GROUND;
}
$('#loading').hide();
}).otherwise(function(error){
swal(error,"请重试!","error");
});
viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(126.60329039879346,45.74025270878488, 500),
orientation : {
heading : Cesium.Math.toRadians(0.0),
pitch : Cesium.Math.toRadians(-20.0),
roll : 0.0
}
});
addPOMListener();
}
function removesmiplemodel(){
viewer.dataSources.remove(smiplemodeldata);
viewer.imageryLayers.remove(localimagery,false);
viewer.imageryLayers.add(tdtannoimagery);
viewer.imageryLayers.add(googleimagery);
}
//交通流动线
var roadodline;
function addODlines(){
var lineheight = 15;
if(isTerrainShow){
lineheight = 1000;
}
var odOption = {
viewer: viewer,
geoJsonUrl: '../../easy3dfile/data/map/road.geojson',
linecolor: Cesium.Color.GOLD,//ORANGE;//ORANGE;//GOLD;//底线颜色
linewidth: 6.0,//底线宽度
lineheight: lineheight,//底线高度
lineglow: 0.15,//底线光晕宽度
tracecolor: Cesium.Color.WHITE,//ORANGE;//GOLD;//尾迹线颜色
tracewidth: 28.0,//尾迹线宽度
timeDuration: 1.0,//各个尾迹线发出的时间间隔
moveBaseDuration: 2.0,//各个尾迹线的速度,数值越大越慢
};
roadodline = CesiumODline.loadGeoJson(odOption);
}
function removeODlines(){
CesiumODline.removeJson(viewer);
}
/***************************上:加载基础三维地图;下:地图工具*************************/
//添加重点地名地址标记,数据来源:@baseMapLabelData.js
var importantLableArr = [];//重点地名地址标记数组
function showImportantLable(){
//计算当前城市的经纬度与米的换算比
if(tmRoadLable.length!=0){
var yPerimeter = 40075016.68557849;
var curlat = Number(tmRoadLable[0].position[1].toString().split('.')[0])*Math.PI/180;
var xPerimeter = yPerimeter * Math.cos(curlat);
var yperi = 360/yPerimeter;
var xperi = 360/xPerimeter;
//显示重要道路标记
for (var i=0;i